package gweb

import (
	"fmt"
	"os"

	"github.com/spf13/viper"
)

type ViperConfig struct {
	Log   []LogConfig `mapstructure:"log"`
	Cache struct {
		Enable bool          `mapstructure:"enable"`
		List   []CacheConfig `mapstructure:"list"`
	}
}

type LogConfig struct {
	Enable bool   `mapstructure:"enable"`
	Option string `mapstructure:"option"`
	Type   string `mapstructure:"type"`
	Level  string `mapstructure:"level"`
}

type CacheConfig struct {
	Enable  bool   `mapstructure:"enable"`
	Default bool   `mapstructure:"default"`
	Name    string `mapstructure:"name"`
	Type    string `mapstructure:"type"`
	Option  string `mapstructure:"option"`
}

var (
	viperConfig ViperConfig
)

// initViper 初始化viper配置
// 需要传入配置路径，如果不传路径默认./config
// 配置采用合并策略，读取配置优先级
// 1、读取app.yml
// 2、读取app-env.yml
// 后读取配置会合并之前的配置
func initViper(configPath string) {
	// 不存在环境变量，默认走prod
	goRunMode = os.Getenv("GO_RUN_MODE")
	if goRunMode == "" {
		goRunMode = "prod"
	}
	fmt.Println("GO_RUN_MODE is", goRunMode)
	if configPath == "" {
		configPath = "./config"
	}
	viper.AddConfigPath(configPath)
	viper.SetConfigType("yml")

	commonConfigFile := "app"
	viper.SetConfigName(commonConfigFile)
	if err := viper.ReadInConfig(); err != nil {
		panic(fmt.Sprintf("read config %s error: %s", commonConfigFile, err.Error()))
	}
	configFile := "app-" + goRunMode
	viper.SetConfigName(configFile)
	if err := viper.MergeInConfig(); err != nil {
		panic(fmt.Sprintf("merge config %s error: %s", configFile, err.Error()))
	}
	err := viper.Unmarshal(&viperConfig)
	if err != nil {
		panic(fmt.Sprintf("unmarshal config error: %s", err.Error()))
	}
}
